/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siseventos.managed;

import br.siseventos.dao.da.PublicoDAO;
import br.siseventos.dao.da.TipoPublicoDAO;
import br.siseventos.model.TbPublico;
import br.siseventos.model.TdTipoPublico;
import br.siseventos.view.util.CallbackHelper;
import br.siseventos.view.util.MessageHelper;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.event.ActionEvent;

@ManagedBean(name = "publicoBean")
@SessionScoped
public class PublicoBean {

    // Campos
    private TipoPublicoDAO daoTipoPublico = null;
    private PublicoDAO daoPublico = null;
    private String nome;
    private List<TdTipoPublico> lstMenuTipoPublico;
    private TdTipoPublico tipoPublicoSelecionado;
    private List<TbPublico> lstDataTablePublico;
    private TbPublico publicoSelecionado;
    // Util
    private int maximoLinhasTablePublico = 5;
    private boolean mostrarMsg = false;

    // Construtor
    public PublicoBean() {
        // Inicializando as daos
        daoPublico = new PublicoDAO();
        daoTipoPublico = new TipoPublicoDAO();

        // Carregando o datatable de publicos
        lstDataTablePublico = daoPublico.consultarTodos();

        // Carregando o menu de tipos de público
        lstMenuTipoPublico = getDaoTipoPublico().consultarTodos();

        /*
         * Iterator<TdTipoPublico> i = l.iterator(); while (i.hasNext()) {
         * TdTipoPublico atual = (TdTipoPublico) i.next();
         * lstMenuTipoPublico.add(new SelectItem(atual,
         * atual.getNmeTipoPublico())); }
         */
    }

    public TipoPublicoDAO getDaoTipoPublico() {
        return daoTipoPublico;
    }

    public void setDaoTipoPublico(TipoPublicoDAO daoTipoPublico) {
        this.daoTipoPublico = daoTipoPublico;
    }

    public PublicoDAO getDaoPublico() {
        return daoPublico;
    }

    public void setDaoPublico(PublicoDAO daoPublico) {
        this.daoPublico = daoPublico;
    }

    // Getters e Setters
    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<TdTipoPublico> getLstMenuTipoPublico() {
        return lstMenuTipoPublico;
    }

    public void setLstMenuTipoPublico(List<TdTipoPublico> lstMenuTipoPublico) {
        this.lstMenuTipoPublico = lstMenuTipoPublico;
    }

    public TdTipoPublico getTipoPublicoSelecionado() {
        return tipoPublicoSelecionado;
    }

    public void setTipoPublicoSelecionado(TdTipoPublico tipoPublicoSelecionado) {
        this.tipoPublicoSelecionado = tipoPublicoSelecionado;
    }

    public List<TbPublico> getLstDataTablePublico() {
        return lstDataTablePublico;
    }

    public void setLstDataTablePublico(List<TbPublico> lstDataTablePublico) {
        this.lstDataTablePublico = lstDataTablePublico;
    }

    public int getMaximoLinhasTablePublico() {
        return maximoLinhasTablePublico;
    }

    public void setMaximoLinhasTablePublico(int maximoLinhasTablePublico) {
        this.maximoLinhasTablePublico = maximoLinhasTablePublico;
    }

    public boolean isMostrarMsg() {
        return mostrarMsg;
    }

    public void setMostrarMsg(boolean mostrarMsg) {
        this.mostrarMsg = mostrarMsg;
    }

    public TbPublico getPublicoSelecionado() {
        return publicoSelecionado;
    }

    public void setPublicoSelecionado(TbPublico publicoSelecionado) {
        this.publicoSelecionado = publicoSelecionado;
    }

    // Actions e listeners
    public void cadastrarPublico(ActionEvent ex) {
        try {
            // Criando o objeto Publico a ser cadastrado no banco
            TbPublico p = new TbPublico();
            p.setNmePublico(getNome());
            p.setTdTipoPublico(getTipoPublicoSelecionado());

            // Cadastrando no banco
            getDaoPublico().incluir(p);

            // Carregar a lista de publicos novamente
            popularListaTipoPublico(daoPublico.consultarTodos());

            // Mostrando msg de sucesso!
            MessageHelper.showGlobalMessage("Público cadastrado com sucesso!", FacesMessage.SEVERITY_INFO);

            // Adicionando o parâmetro de Callback
            CallbackHelper.addCallback("salvo", true);


        } catch (Exception e) {
            MessageHelper.showGlobalMessage("Erro ao cadastrar público!", FacesMessage.SEVERITY_ERROR);
        }
    }

    public void excluirPublico(ActionEvent e) {
        FacesMessage msg = new FacesMessage();
        FacesContext contexto = FacesContext.getCurrentInstance();

        try {
            // Excluindo o público selecionado
            daoPublico.excluir(getPublicoSelecionado().getIdtPublico());

            // Carregar a lista de publicos novamente
            popularListaTipoPublico(daoPublico.consultarTodos());

            // Mostrando mensagem de sucesso
            MessageHelper.showGlobalMessage("Público excluído com sucesso!", FacesMessage.SEVERITY_INFO);

        } catch (Exception ex) {
            // Mostrando mensagem de erro
            MessageHelper.showGlobalMessage("Erro ao excluir público!", FacesMessage.SEVERITY_ERROR);
        }
    }

    public void alterarPublico(ActionEvent e) {
        try {
            // Alterando o público
            daoPublico.alterar(getPublicoSelecionado());

            // Carregar a lista de publicos novamente
            popularListaTipoPublico(daoPublico.consultarTodos());

            // Mostrando mensagem de sucesso
            MessageHelper.showGlobalMessage("Publico alterado com sucesso!", FacesMessage.SEVERITY_INFO);

            // Adicionando o parâmetro de Callback
            CallbackHelper.addCallback("editado", true);

        } catch (Exception ex) {
            // Mostrando mensagem de erro
            MessageHelper.showGlobalMessage("Erro ao alterar público!", FacesMessage.SEVERITY_ERROR);
        }
    }

    // Converters e Utils
    public void popularListaTipoPublico(List<TbPublico> lst) {
        lstDataTablePublico = lst;
    }

    public Converter getConversor() {
        return new Converter() {

            @Override
            public Object getAsObject(FacesContext context, UIComponent component, String value) {
                // Transformar string em objeto
                TdTipoPublico r = null;
                try {
                    r = getDaoTipoPublico().consultarPorIdt(Integer.parseInt(value));
                } catch (NumberFormatException e) {
                } catch (Exception e) {
                }


                return r;

            }

            @Override
            public String getAsString(FacesContext context, UIComponent component, Object value) {
                // Transformar objeto em string
                String r = null;
                if (value instanceof TdTipoPublico) {
                    r = ((TdTipoPublico) value).getIdtTipoPublico().toString();
                }
                return r;
            }
        };

    }
}
